package com.cj.mobile.iabp.mvp.ui.fragment;

import static com.jess.arms.utils.Preconditions.checkNotNull;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.afollestad.materialdialogs.MaterialDialog;
import com.blankj.utilcode.util.ActivityUtils;
import com.cj.mobile.iabp.R;
import com.cj.mobile.iabp.app.utils.CommonUtils;
import com.cj.mobile.iabp.app.utils.IntegerValueFormatter;
import com.cj.mobile.iabp.di.component.DaggerMainComponent;
import com.cj.mobile.iabp.mvp.contract.MainContract;
import com.cj.mobile.iabp.mvp.model.entity.AppUpdate;
import com.cj.mobile.iabp.mvp.presenter.MainPresenter;
import com.cj.mobile.iabp.mvp.ui.activity.PatientStatisticsActivity;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter;
import com.jess.arms.base.BaseFragment;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.OnClick;

/**
 * 统计
 */
public class StatisticsFragment extends BaseFragment<MainPresenter> implements MainContract.View {
    /*--------------------------------控件信息--------------------------------*/

    @BindView(R.id.txvi_statistics_az_num)
    TextView txviAzNum;

    @BindView(R.id.txvi_statistics_cc_num)
    TextView txviCcNum;

    @BindView(R.id.view_statistics_barChart)
    BarChart mBarChart;                                                                             // 趋势图

    /*--------------------------------业务信息--------------------------------*/

    // 对话框
    private MaterialDialog mDialog;

    @Override
    public void onResume() {
        super.onResume();

        if (mPresenter != null) {
            mPresenter.initStatistics();
        }
    }

    public void onDoubleClick() {

    }

    @Override
    public void onDestroy() {
        if (mDialog != null) {
            this.mDialog.dismiss();
        }
        super.onDestroy();
    }

    @Override
    public void setupFragmentComponent(@NonNull AppComponent appComponent) {
        DaggerMainComponent
                .builder()
                .appComponent(appComponent)
                .view(this)
                .build()
                .inject(this);
    }

    @Override
    public View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_statistics, container, false);
    }

    @Override
    public void initData(@Nullable Bundle savedInstanceState) {
        // 初始化Loading对话框
        mDialog = new MaterialDialog.Builder(getContext()).content(R.string.common_execute).progress(true, 0).build();
    }

    @Override
    public void loadStatistics(int install, int remove, List<String> sec2, List<String> sec3, String[] title) {

        txviAzNum.setText(String.valueOf(install));
        txviCcNum.setText(String.valueOf(remove));

        // 数据转换
        List<BarEntry> mCY = new ArrayList<>();
        for (int i = 0; i < sec2.size(); i++) {
            int value = Integer.parseInt(sec2.get(i));
            mCY.add(new BarEntry(i, value));
        }

        List<BarEntry> mTZ = new ArrayList<>();
        for (int i = 0; i < sec3.size(); i++) {
            int value = Integer.parseInt(sec3.get(i));
            mTZ.add(new BarEntry(i, value));
        }

        // 初始化图表配置
        initBarChart(mCY, mTZ, title);
    }

    /**
     * 初始化趋势图
     *
     * @param chaoyangEntries 朝阳区数据源
     * @param tongzhouEntries 通州区数据源
     * @param title           月份
     */
    private void initBarChart(List<BarEntry> chaoyangEntries, List<BarEntry> tongzhouEntries, String[] title) {
        if (chaoyangEntries.isEmpty() || tongzhouEntries.isEmpty()) {
            return; // 容错：数据为空时不初始化
        }

        // 2. 创建数据集（样式不变）
        BarDataSet chaoyangDataSet = new BarDataSet(chaoyangEntries, "朝阳区");
        chaoyangDataSet.setColor(Color.rgb(255, 165, 0)); // 橙色
        chaoyangDataSet.setValueTextColor(Color.BLACK);
        chaoyangDataSet.setValueTextSize(12f);
        chaoyangDataSet.setValueFormatter(new IntegerValueFormatter());

        BarDataSet tongzhouDataSet = new BarDataSet(tongzhouEntries, "通州区");
        tongzhouDataSet.setColor(Color.rgb(60, 179, 113)); // 青绿色
        tongzhouDataSet.setValueTextColor(Color.BLACK);
        tongzhouDataSet.setValueTextSize(12f);
        tongzhouDataSet.setValueFormatter(new IntegerValueFormatter());


        // ========== 3. 创建 BarData 并设置分组参数 ==========
        BarData barData = new BarData(chaoyangDataSet, tongzhouDataSet);
        float groupSpace = 0.3f;   // 组与组之间的间距
        float barSpace = 0f;    // 同组内柱子之间的间距
        float barWidth = 0.3f;     // 每个柱子的宽度
        barData.setBarWidth(barWidth);

        // ========== 4. 配置 X 轴 ==========
        XAxis xAxis = mBarChart.getXAxis();
        xAxis.setValueFormatter(new IndexAxisValueFormatter(title)); // 关联月份标签
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); // X轴在底部
        xAxis.setDrawGridLines(false);                 // 隐藏X轴网格线
//        xAxis.setLabelCount(title.length);       // 保留所有月份标签（滑动时会显示）
        xAxis.setLabelCount(4);
        xAxis.setGranularity(1f);                       // 确保标签不重复
        xAxis.setAvoidFirstLastClipping(true); // 避免首尾标签被截断

        // ========== 5. 配置 Y 轴 ==========
        YAxis leftYAxis = mBarChart.getAxisLeft();
        leftYAxis.setAxisMinimum(0f); // Y 轴最小值为 0
        leftYAxis.setDrawGridLines(true); // 显示Y轴网格线
        leftYAxis.setValueFormatter(new IntegerValueFormatter());
        mBarChart.getAxisRight().setEnabled(false); // 隐藏右侧 Y 轴

        // ========== 新增：配置图例（Label） ==========
        Legend legend = mBarChart.getLegend();
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER); // 水平居中
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); // 垂直方向靠下
        legend.setFormSize(12f); // 图例标记的大小
        legend.setTextSize(14f); // 图例文字大小

        // 关键调整：增加图例与图表的间距
        // 1. 图例自身向下偏移（远离图表），正值有效（因垂直对齐为BOTTOM）
        legend.setYOffset(10f); // 单位：dp（根据需求调整数值）

        // 2. 为图表增加底部额外边距，确保图例有足够空间
        mBarChart.setExtraOffsets(0, 0, 0, 10); // 左、上、右、下的额外边距（单位：dp）

        // ========== 7. 核心：启用左右滑动功能 ==========
        mBarChart.setTouchEnabled(true);          // 允许触摸交互（基础前提）
        mBarChart.setDragEnabled(true);           // 允许水平拖动（左右滑动查看更多月份）
        mBarChart.setScaleEnabled(false);         // 关闭缩放功能（避免误触影响滑动体验）
        mBarChart.setAutoScaleMinMaxEnabled(false); // 关闭Y轴自动缩放，保持数据对比一致性
        mBarChart.setPinchZoom(false);            // 关闭双指缩放（进一步避免误操作）
        mBarChart.setFitBars(true);                 // 自适应柱子宽度，避免柱子边缘被截断

        // ========== 8. 配置图表整体样式 ==========
        mBarChart.setData(barData);
        mBarChart.groupBars(0, groupSpace, barSpace); // 分组显示柱子（必须在setData后调用）
        // ========== 9. 核心：控制初始显示范围（只显4个月份） ==========
        mBarChart.setVisibleXRangeMaximum(4); // 一次最多显示4个月份分组
//        mBarChart.moveViewToX(0); // 初始定位到第1个月份（索引0，即2025-04）
        // 修改为显示最右边的数据
        mBarChart.moveViewToX(Math.max(0, chaoyangEntries.size() - 4)); // 显示最右边的4个数据


        mBarChart.getDescription().setEnabled(false); // 隐藏描述文本
        mBarChart.animateY(1000); // 添加入场动画（Y 轴方向，提升体验）
        mBarChart.invalidate(); // 刷新图表，使配置生效
    }

    @OnClick({
            R.id.btn_statistics_patient_statistics,                                                 // 患者统计
    })
    @Override
    public void onClick(View v) {
        if (!CommonUtils.isDoubleClick()) {
            switch (v.getId()) {
                case R.id.btn_statistics_patient_statistics:                                        // 患者统计
                    ActivityUtils.startActivity(PatientStatisticsActivity.class);
                    break;
            }
        }
    }

    @Override
    public void showLoadingSubmit() {
        if (mDialog != null)
            mDialog.show();
    }

    @Override
    public void hideLoadingSubmit() {
        if (mDialog != null)
            mDialog.hide();
    }


    @Override
    public void setData(@Nullable Object data) {

    }

    @Override
    public void showLoading() {

    }

    @Override
    public void hideLoading() {

    }

    @Override
    public void showMessage(@NonNull String message) {
        checkNotNull(message);
        ArmsUtils.snackbarText(message);
    }

    @Override
    public void launchActivity(@NonNull Intent intent) {
        checkNotNull(intent);
        ArmsUtils.startActivity(intent);
    }

    @Override
    public void killMyself() {

    }

    /**
     * 提示APP升级弹框，在这里不做任何处理
     */
    @Override
    public void askDialog(AppUpdate info) {

    }

    /**
     * 在这里不做任何处理
     */
    @Override
    public void onClickHome() {

    }
}
